package com.simpns.io;


import com.simpns.io.entity.DevReturn;
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Pointer;
import com.sun.jna.ptr.ByteByReference;
import com.sun.jna.ptr.IntByReference;

/**
 * @author gzc
 * @Description:
 * @date 2024-12-30 10:40:33
 */

public interface IOExtendDev extends Library {

    IOExtendDev INSTANCE = (IOExtendDev) Native.loadLibrary("IOExtendDev", IOExtendDev.class);

    /***
     * @description: 打开IO扩展板模块动态库句柄，这一定是第一个调用函数。
     * @author: simpns
     * @date: 2024/12/30 10:50
     * @param p_pcLogicDevName GRGDTATM_CommCfg.ini要加载的设备名称，比如“IOEXTENDDEV”
     * @param p_psStatus 设备状态返回
     * @return Pointer 返回的句柄
     */
    Pointer GRGIO_hOpenLogicDevice(String p_pcLogicDevName, DevReturn[] p_psStatus);

    /**
     * @param pointer
     * @param p_psStatus
     * @return int
     * @description: 通过设置通讯参数，设定动态库中设备的硬件初始通讯配置参数。
     * @author: simpns
     * @date: 2024/12/30 10:53
     */
    int GRGIO_iSetCommPara(Pointer pointer, DevReturn[] p_psStatus);

    /**
     * @param pointer
     * @param psStatus
     * @return int
     * @description: 初始化IO扩展板模块，并将各输入/输出状态设置为缺省状态。
     * @author: simpns
     * @date: 2024/12/30 11:01
     */
    int GRGIO_iInit(Pointer pointer, DevReturn[] psStatus);

    /***
     * @description: 获取由p_ piLightNum指定的灯的当前状态。
     * 当设置为灯的状态为灯灭或灯持续亮时，会获取到正确的灯状态，如果设置的灯状态为灯灭和灯持续亮之外的状态，则获取到的灯状态将不准确，视当时灯所处的状态而定（灯亮或灯灭）。
     * @author: simpns
     * @date: 2024/12/30 11:02
     * @param pointer
     * @param p_piLightNum 灯编号：
     * 0——IOEXTEND_ALLINDICATOR
     * 1——IOEXTEND_INDICATOR1
     * 2——IOEXTEND_INDICATOR2
     * 3——IOEXTEND_INDICATOR3
     * 4——IOEXTEND_INDICATOR4
     * 5——IOEXTEND_INDICATOR5
     * 6——IOEXTEND_INDICATOR6
     * 7——IOEXTEND_INDICATOR7
     * 8——IOEXTEND_INDICATOR8
     * 9——IOEXTEND_INDICATOR9
     * 10——IOEXTEND_INDICATOR10
     * 11——IOEXTEND_INDICATOR11
     * 12——IOEXTEND_INDICATOR12
     * @return int
     */
    int GRGIO_iGetLightStatus(Pointer pointer, int p_piLightNum, DevReturn[] psStatus);

    /***
     * @description: 将p_iLightNum指定的灯对应设置为p_iStatus指定的状态。
     * 对于IO扩展小板（IOEB-001），p_iStatus的状态取取值只能是0-4，p_pbPara取值将被忽略。
     * @author: simpns
     * @date: 2024/12/30 11:06
     * @param pointer
     * @param p_pbPara 当配合闪烁输出时，为占空比参数。例如输出占空比为20%时，PARA为20。PARA范围为0---100
     * 当配合脉冲输出时，为高电平持续时间参数，例如输出150毫秒宽的脉冲时，PARA为150。PARA范围为0—250。
     * @param p_iLightNum 灯编号：
     * 0——IOEXTEND_ALLINDICATOR
     * 1——IOEXTEND_INDICATOR1
     * 2——IOEXTEND_INDICATOR2
     * 3——IOEXTEND_INDICATOR3
     * 4——IOEXTEND_INDICATOR4
     * 5——IOEXTEND_INDICATOR5
     * 6——IOEXTEND_INDICATOR6
     * 7——IOEXTEND_INDICATOR7
     * 8——IOEXTEND_INDICATOR8
     * 9——IOEXTEND_INDICATOR9
     * 10——IOEXTEND_INDICATOR10
     * 11——IOEXTEND_INDICATOR11
     * 12——IOEXTEND_INDICATOR12
     * @param p_iStatus 灯状态
     * 0——IOEXTEND_LIGHT_OFF
     * 1——IOEXTEND_LIGHT_CONTINUOUS
     * 2——IOEXTEND_SLOW_FLASH
     * 3——IOEXTEND_MEDIUM_FLASH
     * 4——IOEXTEND_QUICK_FLASH
     * 5----IOEXTEND_ADJ_FLASH
     * 6----IOEXTEND_PULSE
     * @param psStatus
     * @return int
     */
    int GRGIO_iSetLightStatus(Pointer pointer, byte p_pbPara, int p_iLightNum, int p_iStatus, DevReturn[] psStatus);

    int GRGIO_iSetLightStatusEx(Pointer pointer, byte[] p_pbPara, int[] p_iLightNum, int[] p_iStatus, int ledCount, DevReturn[] psStatus);

    /***
     * @description: 获取门的当前状态。
     * @author: simpns
     * @date: 2024/12/30 11:07
     * @param pointer 门编号：
     * 0——IOEXTEND_ALLDOOR
     * 1——IOEXTEND_DOOR1
     * 2——IOEXTEND_DOOR2
     * 3——IOEXTEND_DOOR3
     * 4——IOEXTEND_DOOR4
     * 5——IOEXTEND_DOOR5
     * 6——IOEXTEND_DOOR6
     * 7——IOEXTEND_DOOR7
     * 8——IOEXTEND_DOOR8
     * 9——IOEXTEND_DOOR9
     * 10——IOEXTEND_DOOR10
     * 11——IOEXTEND_DOOR11
     * 12——IOEXTEND_DOOR12
     * @param p_iDoorNum 门状态
     * 1——IOEXTEND_DOOR_OPEN
     * 0——IOEXTEND_DOOR_CLOSE
     * @param psStatus
     * @return int
     */
    int GRGIO_iGetDoorStatus(Pointer pointer, int p_iDoorNum, DevReturn[] psStatus);

    /***
     * @description: 检测IO扩展板模块是否处在正常的工作状态。
     * @author: simpns
     * @date: 2024/12/30 11:08
     * @param psStatus
     * @return int
     */
    int GRGIO_iGetStatus(Pointer pointer, DevReturn[] psStatus);

    /***
     * @description: 检测IO扩展板模块是否处在正常的工作状态。
     * @author: simpns
     * @date: 2024/12/30 11:12
     * @param pointer
     * @param psStatus
     * @return int
     */
    int GRGIO_iGetDevStatus(Pointer pointer, DevReturn[] psStatus);

    /***
     * @description: 查询硬件的版本号。
     * @author: simpns
     * @date: 2024/12/30 11:10
     * @param pointer
     * @param p_pcVersion 硬件版本号
     * @return int
     */
    int GRGIO_iGetDevVersion(Pointer pointer, String p_pcVersion);
}
